package com.huaxin.hxmodulestatisticalanalysis.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 断路器状态记录实体类
 * <p>
 * 用于表示微机保护设备（microprocessor_relay）中某个断路器在某一时刻的状态快照，
 * 主要用于构建“分合闸状态变化时间线”功能。
 * <p>
 * 数据来源：device_data_collection_wide 表
 * 适用场景：断路器状态历史查询、操作日志、趋势分析等
 */
public class BreakerStatusRecord {

    /**
     * 唯一ID（UUID）
     * 对应表字段：id
     * 说明：每条采集数据的全局唯一标识符
     */
    @Schema(description = "唯一ID", example = "1")
    private String id;

    /**
     * 创建时间（数据采集时间）
     * 对应表字段：created_at
     * 说明：该条记录的生成时间，即断路器状态被记录的时间点
     */
    @Schema(description = "创建时间", example = "2023-07-01 12:00:00")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    /**
     * 组织ID
     * 对应表字段：org_id
     * 说明：所属组织机构ID，用于多租户隔离和权限控制
     */
    @Schema(description = "组织ID", example = "1")
    private String orgId;

    /**
     * 家族ID（可选）
     * 对应表字段：family_id
     * 说明：设备所属的家族或分组ID，可用于设备分类管理
     */
    @Schema(description = "家族ID", example = "1")
    private String familyId;

    /**
     * 设备类型
     * 对应表字段：device_type
     * 固定值示例：'microprocessor_relay'（微机保护）
     * 说明：标识当前设备的类型，本类主要用于微机保护断路器状态查询
     */
    @Schema(description = "设备类型", example = "microprocessor_relay")
    private String deviceType;

    /**
     * 设备编号/名称
     * 对应表字段：device_id
     * 说明：设备在系统中的唯一编号，用于定位具体设备
     */
    @Schema(description = "设备编号/名称", example = "1")
    private Long deviceId;

    /**
     * 站号
     * 对应表字段：station_number
     * 说明：设备在通信网络中的站地址，常用于Modbus、IEC104等协议通信
     */
    @Schema(description = "站号", example = "1")
    private Long stationNumber;

    /**
     * 断路器状态（open=分闸, closed=合闸）
     * 动态映射字段：根据查询参数映射为 breaker1_status, breaker2_status 等
     * 说明：表示当前断路器的开关状态，是时间线的核心数据
     */
    @Schema(description = "断路器状态", example = "open")
    private String breakerStatus;

    /**
     * A相电压 (kV)
     * 对应表字段：voltage_a_kv
     * 单位：kV
     * 说明：断路器状态发生时的A相电压值，可用于状态合理性分析
     */
    @Schema(description = "A相电压", example = "230.0")
    private BigDecimal voltageAkv;

    /**
     * A相电流 (A)
     * 对应表字段：current_a_a
     * 单位：A
     * 说明：断路器状态发生时的A相电流值，辅助判断负载状态
     */
    @Schema(description = "A相电流", example = "10.0")
    private BigDecimal currentAa;

    /**
     * 总有功功率 (kW)
     * 对应表字段：active_power_total_kw
     * 单位：kW
     * 说明：断路器合闸时的功率水平，可用于判断是否带载操作
     */
    @Schema(description = "总有功功率", example = "100.0")
    private BigDecimal activePowerTotalKw;

    // ==================== Getter 和 Setter 方法 ====================

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }

    public String getOrgId() {
        return orgId;
    }

    public void setOrgId(String orgId) {
        this.orgId = orgId;
    }

    public String getFamilyId() {
        return familyId;
    }

    public void setFamilyId(String familyId) {
        this.familyId = familyId;
    }

    public String getDeviceType() {
        return deviceType;
    }

    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }

    public Long getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(Long deviceId) {
        this.deviceId = deviceId;
    }

    public Long getStationNumber() {
        return stationNumber;
    }

    public void setStationNumber(Long stationNumber) {
        this.stationNumber = stationNumber;
    }

    public String getBreakerStatus() {
        return breakerStatus;
    }

    public void setBreakerStatus(String breakerStatus) {
        this.breakerStatus = breakerStatus;
    }

    public BigDecimal getVoltageAkv() {
        return voltageAkv;
    }

    public void setVoltageAkv(BigDecimal voltageAkv) {
        this.voltageAkv = voltageAkv;
    }

    public BigDecimal getCurrentAa() {
        return currentAa;
    }

    public void setCurrentAa(BigDecimal currentAa) {
        this.currentAa = currentAa;
    }

    public BigDecimal getActivePowerTotalKw() {
        return activePowerTotalKw;
    }

    public void setActivePowerTotalKw(BigDecimal activePowerTotalKw) {
        this.activePowerTotalKw = activePowerTotalKw;
    }

    // ==================== toString 方法 ====================

    @Override
    public String toString() {
        return "BreakerStatusRecord{" +
                "id='" + id + '\'' +
                ", createdAt=" + createdAt +
                ", orgId='" + orgId + '\'' +
                ", deviceId=" + deviceId +
                ", breakerStatus='" + breakerStatus + '\'' +
                ", voltageAkv=" + voltageAkv +
                ", currentAa=" + currentAa +
                ", activePowerTotalKw=" + activePowerTotalKw +
                '}';
    }
}